;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Dit is een IIC driver voor de ADuC832 microcontroller.
; De driver bevat alle routines om de ADuC als master te gebruiken.
; Als I/O worden de IIC pinnen gebruikt sdata en sclock. Vermits de pinnen niet
; eenvoudig gebruikt kunnen worden, zijn er macro's voorzien.
;
; Geschreven door Roggemans Marc (MGM) op 03/2005 v0
;
; Beschikbare routines:
; iicinit       klaar zetten van de iic voor gebruik
; iicstart      verzenden van een start conditie
; iicstop       verzenden van een stop conditie
; iicoutbyte    verzenden van 1 byte vanuit de accu, er wordt een negende klok
;               verzonden, in de carry wordt de ack van de slave weergegeven
; iicinbytea    leest een byte van de iic bus en genereerd een ack op de
;               negende klokpuls
; iicinbyten    leest een byte van de iic bus en genereerd een nack op de 
;               negende klokpuls
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; iicoutbit     is een macro die de carry op de iic pin data naar buiten stuurt

iicoutbit       macro
                mov     mdo,c           ;carry naar de mdo pin
                setb    mde             ;pin als output activeren
                setb    mco             ;klokpukls hoog
                clr     mco             ;klokpuls laag
                endm

; iicinbit      is een macro die de data op de iic data pin in de carry plaatst

iicinbit        macro
                clr     mde             ;iic data pin als input schakelen
                setb    mco             ;klokpuls hoog
                mov     c,mdi           ;data inlezen in de carry
                clr     mco             ;klokpuls terug laag
                endm


; iicinit       is een subroutine die de iic van de ADuC als master instelt

iicinit:        setb    mdo             ;data moet hoog wakker worden
                setb    mco             ;klok moet hoog wakker worden
                setb    mde             ;data wordt als output geschakeld
                setb    i2cm            ;master mode inschakelen
                ret

; iicstart      is een subroutine die de start conditie op de pinnen plaatst

iicstart:       setb    mco             ;zeker zijn dat de klok hoog is
                clr     mdo             ;data moet laag worden
                setb    mde             ;data pin enable
                clr     mco             ;klok laag maken
                ret

; iicstop       is een subroutine die de stop conditie opwekt.

iicstop:        clr     mdo             ;data moet laag worden
                setb    mde             ;data mag naar buiten
                setb    mco             ;nu moet de klok omhoog
                setb    mdo             ;nu data pin hoog maken
                ret                

; iicoutbyte    zal de accu naar buiten sturen, msb eerst.
;               De routine gebruikt geen registers, behalve de psw
;               De carry zal de waarde van de ack bit bevatten na het
;               uitvoeren van de routine.

iicoutbyte:     push    acc             ;worden effe op stack bewaard
                push    b
                mov     b,#008h         ;loopcounter
iicoutbyte1:    rlc     a               ;bit in de carry plaatsen
                iicoutbit               ;bitje verzenden
                djnz    b,iicoutbyte1   ;volledige byte verzenden
                iicinbit                ;ack inlezen in de carry
                pop     b
                pop     acc             ;registers herstellen
                ret

; iicinbytea    zal in de accu een byte inlezen, msb eerst.
;               De routine gebruikt geen registers. De routine zal als
;               negende bit een ack verzenden.

iicinbytea:     push    b               ;deze registers worden gebruikt
                push    psw
                mov     b,#008h         ;wordt gebruikt als loopcounter
iicinbytea1:    iicinbit                ;lees eerste bit
                rlc     a               ;in accu shiften
                djnz    b,iicinbytea1   ;volledige byte ontvangen
                clr     c               ;ack verzenden
                iicoutbit
                pop     psw             ;registers herstellen
                pop     b
                ret

; iicinbyten    zal in de accu een byte inlezen, msb eerst.
;               De routine gebruikt geen registers. De routine zal als
;               negende bit een nack verzenden.

iicinbyten:     push    b               ;deze registers worden gebruikt
                push    psw
                mov     b,#008h         ;wordt gebruikt als loopcounter
iicinbyten1:    iicinbit                ;lees eerste bit
                rlc     a               ;in accu shiften
                djnz    b,iicinbyten1   ;volledige byte ontvangen
                setb    c               ;nack verzenden
                iicoutbit
                pop     psw             ;registers herstellen
                pop     b
                ret

